/**
 * 
 */
package ar.uba.is2.common.mensaje;

import java.io.StringReader;
import java.util.Date;
import java.util.Scanner;
import java.util.regex.Pattern;

import org.apache.commons.lang.builder.EqualsBuilder;
import org.apache.commons.lang.builder.HashCodeBuilder;

/**
 * Dato que fue sensado por un sensor.
 * 
 * @author ger
 * 
 */
public class DatoSensado {

	private static final Pattern PATTERN = Pattern.compile(",");

	public static DatoSensado deserializar(String stream) {
		if (! (stream.startsWith("<") && stream.endsWith(">"))){
			throw new RuntimeException(String.format("El stream %s no es un dato sensado serializado", stream));
		}
		
		DatoSensado dato = new DatoSensado();
		stream = stream.substring(1, stream.length() - 1);
		Scanner scanner = new Scanner(new StringReader(stream));

		scanner.useDelimiter(PATTERN);
		
		int id = scanner.nextInt();
		dato.setIdSensor(id);
		
		float valor = Float.valueOf(scanner.next());
		dato.setValor(valor);
		
		long timestamp = Long.valueOf(scanner.nextLong());
		dato.setFechaSensada(new Date(timestamp));
		
		return dato;
	}

	public static String serializar(DatoSensado dato){
		return dato.toString();
	}

	/**
	 * Identificador del sensor.
	 */
	private int idSensor;

	/**
	 * Fecha de creacion del dato.
	 */
	private long timestamp;

	/**
	 * valor del dato sensado.
	 */
	private float valor;
	
	/**
	 * Constructor de DatoSensado
	 */
	public DatoSensado(float valorSensado, int id_sensor, Date fechaSensada) {
		this.setValor(valorSensado);
		this.setIdSensor(id_sensor);
		this.timestamp = fechaSensada.getTime();
	}

	DatoSensado(){
		// lo pide hibernate
	}

	@Override
	public boolean equals(Object obj) {
		if (!(obj instanceof DatoSensado)) {
			return false;
		}
		DatoSensado that = (DatoSensado) obj;
		return new EqualsBuilder().append(this.idSensor, that.idSensor).append(this.valor, that.valor).append(this.timestamp, that.timestamp).isEquals();
	}

	/**
	 * @return the timestamp
	 */
	public Date getFechaSensada() {
		return new Date(this.timestamp);
	}

	/**
	 * @return the idSensor
	 */
	public int getIdSensor() {
		return idSensor;
	}

	/**
	 * @return the valor
	 */
	public float getValor() {
		return valor;
	}

	@Override
	public int hashCode() {
		return new HashCodeBuilder().append(this.idSensor).append(this.valor).append(this.timestamp).toHashCode();
	}

	/**
	 * @param fechaSensada
	 *            the timestamp to set
	 */
	public void setFechaSensada(Date fechaCreacion) {
		this.timestamp = fechaCreacion.getTime();
	}
	
	/**
	 * @param idSensor
	 *            the idSensor to set
	 */
	public void setIdSensor(int idSensor) {
		this.idSensor = idSensor;
	}

	/**
	 * @param valor
	 *            the valor to set
	 */
	public void setValor(float valor) {
		this.valor = valor;
	}

	@Override
	public String toString() {
		return String.format("<%s,%s,%s>",this.idSensor, this.valor,getTimestamp());  
	}
	
	// necesario para hibernate
	void setTimestamp(long timestamp){
		this.timestamp = timestamp;
	}
	
	long getTimestamp() {
		return this.timestamp;
	}
	
}
